#!/bin/bash

#nombre de usuario
ME=`whoami`

CONFIG_FILE="/etc/michelle/modulos/limitaciones/config/$ME"

#Cargo las variables con los valores actuales en 0
ACT_CPU_SES=0
ACT_MEM_SES=0
ACT_PROC_SES=0
ACT_SOCK_SES=0
ACT_ARCH_SES=0

#Codigos de salida
OK=0

#HARDCODEO EL PID DEL PADRE PARA LAS PRUEBAS, ESTO DEBE SER BORRADO
#COREPID=3140

#Procesos de sesion
PROCSESION=`ps --ppid $COREPID -o pid`
#Elimino la primer el primer elemento que dice "PID" y le agrego el proceso COREPID
PROCSESION=$(echo $PROCSESION $COREPID|awk '{for(i=2; i<=NF; i++) print $i;}')

#Funciones principales
######################################
function Iniciar(){
	if [ ! -e $CONFIG_FILE ]; then 
		/usr/bin/funciones_log.sh ERROR_READ_FILECONFIG
		return 1
	fi
	export MAX_CPU_SES=`cat "$CONFIG_FILE"|grep "MAX_CPU_SES"|awk '{print $2}'`
	export MAX_MEM_SES=`cat "$CONFIG_FILE"|grep "MAX_MEM_SES"|awk '{print $2}'`
	export MAX_PROC_SES=`cat "$CONFIG_FILE"|grep "MAX_PROC_SES"|awk '{print $2}'`
	export MAX_SOCK_SES=`cat "$CONFIG_FILE"|grep "MAX_SOCK_SES"|awk '{print $2}'`
	export MAX_ARCH_SES=`cat "$CONFIG_FILE"|grep "MAX_ARCH_SES"|awk '{print $2}'`

	return $OK
}
######################################
function Detener(){
	export MAX_CPU_SES=""
	export MAX_MEM_SES=""
	export MAX_PROC_SES=""
	export MAX_SOCK_SES=""
	export MAX_ARCH_SES=""

	return $OK
}
######################################
function Informacion(){
	#Carga las variables con los valores actuales de cada parámetro
	actualizarValoresActuales
	#Muestro por pantalla los valores máximos y actuales
	echo "Información de límites"
	echo "----------------------------------------------"
	echo "Parametro       	máximo		actual"
	echo "Uso de CPU:     	$MAX_CPU_SES		$ACT_CPU_SES"
	echo "Uso de memoria: 	$MAX_MEM_SES		$ACT_MEM_SES"
	echo "Uso de procesos:	$MAX_PROC_SES		$ACT_PROC_SES"
	echo "Uso de sockets: 	$MAX_SOCK_SES		$ACT_SOCK_SES"
	echo "Uso de archivos:	$MAX_ARCH_SES		$ACT_ARCH_SES"

	return $OK
}
######################################
function Procesar (){
	#Reseteo el valor de retorno, y evaluo cada condición	
	ERROR=0
	#Carga las variables con los valores actuales de cada parámetro	
	actualizarValoresActuales

	if [ $ACT_CPU_SES -gt $MAX_CPU_SES ]; then
		ERROR=1
		/usr/bin/funciones_log.sh ERROR_CANTMAX_RECURSOS_CPU_SES $ACT_CPU_SES
	elif [ $ACT_MEM_SES -gt $MAX_MEM_SES ]; then
		ERROR=1
		/usr/bin/funciones_log.sh ERROR_CANTMAX_RECURSOS_MEM_SES $ACT_MEM_SES	
	elif [ $ACT_PROC_SES -gt $MAX_PROC_SES ]; then
		/usr/bin/funciones_log.sh ERROR_CANTMAX_RECURSOS_PROC_SES $ACT_PROC_SES
		ERROR=1
	elif [ $ACT_SOCK_SES -gt $MAX_SOCK_SES ]; then
		/usr/bin/funciones_log.sh ERROR_CANTMAX_RECURSOS_SOCK_SES $ACT_SOCK_SES
		ERROR=1
	elif [ $ACT_ARCH_SES -gt $MAX_ARCH_SES ]; then
		/usr/bin/funciones_log.sh ERROR_CANTMAX_RECURSOS_ARCH_SES $ACT_ARCH_SES
		ERROR=1
	fi
	
#	if [ $ERROR -eq 1 ]; then
#		/usr/bin/funciones_log.sh ERROR_CANTMAX_RECURSOS
#	fi

	return $ERROR
}
######################################

#Funciones auxiliares
function actualizarValoresActuales(){
	getActCPU
	getActMemoria
	getActProcesos
	getActSockets
	getActArchivos
}
function getActCPU(){
	#Calculo el cpu load del usuario
	detcpu=$(ps u $PROCSESION | awk '{print $3}')
	loadcpu=$(echo $detcpu|awk -F 'CPU ' '{print $2}')
	totalcpu=0
	for i in $loadcpu; do
		totalcpu=`echo "$totalcpu + $i"|bc`
	done
	#Multiplico por 100 para sacar convertirlo en entero
	ACT_CPU_SES=`echo "scale=0; $totalcpu / 0.01"|bc`
}
function getActMemoria(){
	#Calculo la memoria utilizada por procesos del usuario
	detmem=$(ps u $PROCSESION | awk '{print $4}')
	loadmem=$(echo $detmem|awk -F 'MEM ' '{print $2}')
	totalmem=0
	for i in $loadmem; do
		totalmem=`echo "$totalmem + $i"|bc`
	done
	#Multiplico por 100 para sacar convertirlo en entero
	ACT_MEM_SES=`echo "scale=0; $totalmem / 0.01"|bc`
}
function getActProcesos(){
	ACT_PROC_SES=$(echo $PROCSESION | wc -w)
}
function getActSockets(){
	totalsock=0
	for i in $PROCSESION; do
		cantsock=`ls /proc/$i/fd -l|grep socket|wc -l`
		totalsock=$(($totalsock + $cantsock))
	done
	ACT_SOCK_SES=$totalsock
}
function getActArchivos(){
	lsofprocsesion=$(echo $PROCSESION|sed 's/ /,/g')
	ACT_ARCH_SES=`lsof -w -p $lsofprocsesion | grep REG | wc -l`
}


OPERACION=$1
case $OPERACION in
	"Iniciar"|"iniciar")
		Iniciar
		;;
	"Detener"|"detener")
		Detener
		;;
	"Informacion"|"informacion")
		Informacion
		;;
	"Procesar"|"procesar")
		Procesar
		;;
esac
